package com.monitorStudy.controller;

import io.prometheus.client.Histogram;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RestController;

/**
 * 主要用来统计数据的分布情况，这是一种特殊的metrics数据类型，代表的是一种近似的百分比估算数值，统计所有离散的指标数据在各个取值区段内的次数。例如：我们想统计一段时间内http请求响应小于0.005秒、小于0.01秒、小于0.025秒的数据分布情况。那么使用Histogram采集每一次http请求的时间，同时设置bucket。
 *
 * Histogram会自动创建3个指标，分别为：
 * 一、事件发生总次数： basename_count:
 * #实际含义： 当前一共发生了2次http请求
 * io_namespace_http_requests_latency_seconds_histogram_count{path="/",method="GET",code="200",} 2.0
 * 二、所有事件产生值的大小的总和： basename_sum
 * #实际含义： 发生的2次http请求总的响应时间为13.107670803000001 秒
 * io_namespace_http_requests_latency_seconds_histogram_sum{path="/",method="GET",code="200",} 13.107670803000001
 * 三、事件产生的值分布在bucket中的次数： basename_bucket{le="上包含"}
 * # 在总共2次请求当中。http请求响应时间 <=0.005 秒 的请求次数为0
 * io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.005",} 0.0
 * 在总共2次请求当中。http请求响应时间 <=0.01 秒 的请求次数为0
 * io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.01",} 0.0
 * 在总共2次请求当中。http请求响应时间 <=0.025 秒 的请求次数为0
 * io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.025",} 0.0
 *
 * @author: Alan
 * @date: 2021/5/13 23:16
 */
@RestController
public class HistogramDemo {

    /**
     * 注册
     * 注册时buckets()设置区间值，如下设置了100、200、300三个区间值
     */
    public static final Histogram histogramDemo = Histogram.build()
            .labelNames("label1", "label2", "label3", "label4", "label5")
            .name("histogramDemo")
            .buckets(100, 200, 300)
            .help("Histogram 实例")
            .register();

    /**
     * 指标埋点
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void changeHistogram()
    {
        /**
         * 本次执行的指标值
         * 如下设置为150，则每次执行，小于200区间以及小于300区间加1，小于100区间不变
         */
        histogramDemo.labels("1", "2", "3", "4", "5").observe(150);
    }

}
